package org.persistente.esquema;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.persistente.PersistenteException;

/**
 *
 * @author phireis
 */
public class Tabela {

    private String nome;
    private Set<CampoAbstrato> campos;
    private Set<CampoAbstrato> chaves;
    private Set<CampoAbstrato> outros;
    private Map<String, CampoAbstrato> indice;

    public Tabela(String nome) {
        this.nome = nome;

        campos = new LinkedHashSet<CampoAbstrato>();
        chaves = new LinkedHashSet<CampoAbstrato>();
        outros = new LinkedHashSet<CampoAbstrato>();
        indice = new HashMap<String, CampoAbstrato>();
    }

    public String getNome() {
        return nome;
    }

    public Set<CampoAbstrato> getCampos() {
        return campos;
    }

    public Set<CampoAbstrato> getChaves() {
        return chaves;
    }

    public Set<CampoAbstrato> getOutros() {
        return outros;
    }



    public void adicionaCampo(CampoAbstrato campo){
        campos.add(campo);
        outros.add(campo);
        indice.put(campo.getNome(), campo);
    }

    public void adicionaChave(CampoAbstrato campo){
        campos.add(campo);
        chaves.add(campo);
        indice.put(campo.getNome(), campo);
    }
    
    public void setChavePrimaria(String... chave){
        chaves.clear();
        outros.clear();
        for(String ch : chave){
            CampoAbstrato campo = getCampo(ch);
            if(campo == null){
                throw new PersistenteException("Chave primária inválida. Campo inexistente.");
            }
            chaves.add(campo);
        }
        for(CampoAbstrato campo : campos){
            if(!chaves.contains(campo)){
                outros.add(campo);
            }
        }
    }


    public CampoAbstrato getCampo(String nomeCampo){
        return indice.get(nomeCampo);
    }


}
